题解:P12004 【MX-X10-T0】[LSOT-4] 嗯欧哎劈

思路

考虑直接模拟。

可以在读入之后按照题意先计算三个奖项的分数线,再进行判断。

我们定义 fir, sec, thi 分别表示一至三等奖的分数线,那么可以这样进行计算(数组 a 表示所有省的一等奖分数线,因为题目已经写了从大到小进行排序,我们不需要再进行排序了):

1
2
3
fir = a[1];
sec = a[3] - 1;
thi = 40;

那么如果判断是这样写:

1
2
3
4
5
6
7
8
if(x >= fir)
cout << "sidekick" << endl;
if (x >= sec)
cout << "sgnd" << endl;
if (x >= thi)
cout << "cxq" << endl;
if (x < thi)
cout << "kiku" << endl;

就会导致一等奖分数线及以上的成绩会同时输出三个奖项的结果(不会输出没得奖的结果是因为不得奖和三等奖的判断条件相反,要么三等奖要么不得奖)。

那么我们可以用到这个:

1
2
3
4
5
6
if(判断条件) // 如果
结果
else if(判断条件) // 如果
结果
else // 否则
结果

这个代码与下面代码:

1
2
3
4
if(判断条件) // 如果
结果
if(判断条件) // 如果
结果

区别在于,第一个代码会按顺序判断,一旦满足 if 中的条件,则会停止后面的判断。

而第二个代码一旦满足其中的条件,并不会停止判断,而是继续判断下面的语句。

这样如果满足一等奖的判断语句,就不会继续判断二等奖了。

插一句,如果你这样写:if(x >= fir) return cout << "sidekick" << endl, 0;,即输出之后结束程序也是可以的,这样也可以不用 else if

同理,如果二等奖与三等奖成绩相同,因为先判断二等奖,满足二等奖条件输出之后直接结束判断,所以不会影响三等奖。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int x, a[35], fir, sec, thi;
// 这个人的成绩,所有省份的一等奖分数线
// 场切省一等奖,二等奖,三等奖分数线
int main(){
cin >> x;
for(int i = 1;i <= 32;i++)
cin >> a[i];
fir = a[1];
sec = a[3] - 1;
thi = 40;
if(x >= fir)
cout << "sidekick" << endl;
else if (x >= sec)
cout << "sgnd" << endl;
else if (x >= thi)
cout << "cxq" << endl;
else
cout << "kiku" << endl;
return 0;
}